package com.ssd.handler;

import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.NumberUtil;
import com.alibaba.excel.util.NumberUtils;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.ssd.api.user.UserApi;
import com.ssd.api.user.dto.UserVo;
import com.ssd.constants.RedisConstants;
import com.ssd.entity.Activity;
import com.ssd.entity.Coupon;
import com.ssd.enums.CouponStatusEnum;
import com.ssd.service.IActivityService;
import com.ssd.service.ICouponService;
import com.ssd.sync.SyncProcessHandler;
import com.ssd.sync.modle.SyncMessage;
import com.ssd.utils.DateUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;

/**
 * 抢单成功同步任务
 */
@Component(RedisConstants.RedisKey.COUPON_SEIZE_SYNC_QUEUE_NAME)
@Slf4j
public class SeizeCouponSyncProcessHandler implements SyncProcessHandler<Object> {
    // 注入活动服务接口，用于处理与活动相关的业务逻辑
    @Resource
    private IActivityService activityService;

    // 注入优惠券服务接口，用于处理与优惠券相关的业务逻辑
    @Resource
    private ICouponService couponService;


    private UserApi userApi;
    /**
     * 批量处理数据同步方法
     * @param multiData
     */
    @Override
    public void batchProcess(List<SyncMessage<Object>> multiData) {
        throw new RuntimeException("不支持批量处理！");
    }

    /**
     * 单个处理
     * @param singleData 抢单用户id
     */
    @Override
    public void singleProcess(SyncMessage<Object> singleData) {
        //记录日志，获取要同步的数据
        log.info("获取要同步的数据：{}",singleData);

        //用户id
        long userId = NumberUtil.parseLong(singleData.getKey().toString());

        //活动id
        long activityId = NumberUtil.parseLong(singleData.getValue().toString());

        //记录日志，输出用户id和活动id
        log.info("userId={},activity={}",userId,activityId);

        //1.获取活动
        Activity activity = activityService.getById(activityId);

        //检查活动是否存在
        if (ObjectUtils.isNull(activity)){
            return;//活动不存在
        }

        //获取用户信息 TODO
//        UserVo userVo = userApi.findById(userId);
        UserVo userVo = new UserVo();
        userVo.setId(1L);
        userVo.setUserName("张三");
        userVo.setMobile("18900000000");

        //检查用户是否存在
        if (ObjectUtils.isNull(userVo)){
            return;//用户不存在
        }

        //2.新增优惠券
        Coupon coupon = new Coupon();
        coupon.setId(IdUtil.getSnowflake().nextId());//id:雪花算法
        coupon.setActivityId(activityId);//活动id
        coupon.setUserId(userVo.getId());//用户id
        coupon.setUserName(userVo.getUserName());//用户名称
        coupon.setUserPhone(userVo.getMobile());//手机号
        coupon.setName(activity.getName());//活动名称
        coupon.setType(activity.getType());//类型
        coupon.setDiscountAmount(activity.getDiscountAmount());
        coupon.setDiscountRate(activity.getDiscountRate());
        coupon.setAmountCondition(activity.getAmountCondition());
        coupon.setValidityTime(DateUtils.now().plusDays(activity.getValidityDays()));//有效期
        coupon.setStatus(CouponStatusEnum.NO_USE.getStatus());//未使用

        //保存优惠券
        couponService.save(coupon);

        //3.扣减库存
        activityService.deductStock(activityId);
    }
}


